
package ejb;

import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.ejb.LocalBean;
import java.util.Date;
import java.util.ListIterator;

@Stateless
@LocalBean
public class BusinessLogic {
    @EJB
    private PistaFacade pistaFacade;
    @EJB
    private ArticoloFacade articoloFacade;
    @EJB
    private UtenteFacade utenteFacade;
    @EJB
    private CarrelloFacade carrelloFacade;
    @EJB
    private StoricoFacade storicoFacade;
    @EJB
    private CommentoFacade commentoFacade;
    
    
    public List<Utente> listaUtenti() {
        return utenteFacade.findAll();
    }
    
    public Articolo cercaArticolo(String id){
        return (Articolo)articoloFacade.queryPersonalizzata("SELECT a FROM Articolo a WHERE a.id='" + id + "'").getSingleResult();
    }

    public void aggiungiUtente(Utente utente) {
        utenteFacade.create(utente);
    }
    
    public List<Articolo> listaArticoli() {
        return articoloFacade.findAll();
    }
    
    public List<Articolo> listaArticoliOrdinati() {
        return articoloFacade.queryPersonalizzata("SELECT a FROM Articolo a ORDER BY a.marca,a.modello").getResultList();
    }
    
    public List<Articolo> listaArticoliOrdinatiPerId() {
        return articoloFacade.queryPersonalizzata("SELECT a FROM Articolo a ORDER BY a.id DESC").getResultList();
    }
    
    public List<Articolo> listaArticoliPerTipo(String tipo) {
        return articoloFacade.queryPersonalizzata("SELECT a FROM Articolo a WHERE a.tipo='" + tipo + "' ORDER BY a.taglia").getResultList();
    }
    
    public List<Articolo> listaArticoliPerTipo() {
        return articoloFacade.queryPersonalizzata("SELECT a FROM Articolo a ORDER BY a.tipo").getResultList();
    }
    
    public List<Articolo> listaArticoliPerTipoDaMarca(String marca) {
        return articoloFacade.queryPersonalizzata("SELECT a FROM Articolo a WHERE a.marca='" + marca + "' ORDER BY a.tipo").getResultList();
    }
    
    public List<Articolo> listaArticoliPerModello() {
        return articoloFacade.queryPersonalizzata("SELECT a FROM Articolo a ORDER BY a.modello").getResultList();
    }
    
    public List<Articolo> listaArticoliPerMarca(String marca) {
        String query = "SELECT a FROM Articolo a WHERE a.marca='" + marca + "' ORDER BY a.modello";
        System.out.println(query);
        return articoloFacade.queryPersonalizzata("SELECT a FROM Articolo a WHERE a.marca='" + marca + "' ORDER BY a.modello").getResultList();
    }
    
    public List<Articolo> listaArticoliPerModello(String marca, String tipo) {
        String query = "SELECT a FROM Articolo a WHERE a.marca='" + marca + "' AND a.tipo='" + tipo + "' ORDER BY a.modello";
        return articoloFacade.queryPersonalizzata(query).getResultList();
    }
    
    public int modificaArticolo(String query) {
        return articoloFacade.queryPersonalizzata(query).executeUpdate();
    }

    public void aggiungiArticolo(Articolo articolo) {
        List<Articolo> resultList = articoloFacade.queryPersonalizzata("SELECT a FROM Articolo a WHERE a.marca='" + articolo.getMarca() +"' AND a.modello='"+articolo.getModello()+"' AND a.tipo='"+articolo.getTipo()+"' AND a.taglia='"+articolo.getTaglia()+"'").getResultList();
        if(resultList.isEmpty())
            articoloFacade.create(articolo);
        else{
            int quantita = resultList.get(0).getQuantita()+articolo.getQuantita();
            String query = "UPDATE Articolo a SET a.quantita="+quantita+" WHERE a.id = "+resultList.get(0).getId();
            articoloFacade.queryPersonalizzata(query).executeUpdate();
        }
    }
    
    public void eliminaArticolo(Articolo articolo) {
        articoloFacade.remove(articolo);
    }
    
    public List<Utente> estraiNuoviUtenti() {
        return utenteFacade.queryPersonalizzata("SELECT u FROM Utente u WHERE u.flag=0").getResultList();
    }
    
    public void updatePermessi(String flag, long id) {
        String query = "UPDATE Utente u SET u.flag='" + flag + "' WHERE u.id='" + id + "'";
        System.out.println(query);
        utenteFacade.queryPersonalizzata(query).executeUpdate();
    }
    
    public void aggiungiCommento(Commento commento){
        commentoFacade.create(commento);
    }
    
    public List<Commento> listaCommentiOrdinati(Long id){
        return commentoFacade.queryPersonalizzata("SELECT c FROM Commento c WHERE c.prodotto_id=" + id + " ORDER BY c.data").getResultList();
    }
    
    public void decrementaQuantita(Carrello c, int n) {
        int q = c.getQuantita();
        if((q - n) > 0){
            q -= n;
            System.out.println(q);
            carrelloFacade.queryPersonalizzata("UPDATE Carrello a SET a.quantita=" + q + " WHERE a.id=" + c.getId() + "").executeUpdate();
            System.out.println("UPDATE Carrello a SET a.quantita=" + q + " WHERE a.id=" + c.getId() + "");
        }
        else
            carrelloFacade.remove(c);
    }
    
    public int numeroArticoliInCarrello(String username){
        List<Carrello> q = getUserCarrello(username);
        int quantita = 0;
        for(int i = 0; i < q.size(); i++)
            quantita += q.get(i).getQuantita();
        return quantita;
    }
    
    public List<Carrello> getUserCarrello(String username){
        List<Carrello> cart = carrelloFacade.findAll();
        Carrello temp;
        for(int i = 0; i < cart.size();i++){
            temp = cart.get(i);
            if(!temp.getUsername().equals(username))
                cart.remove(temp);
        }
        return cart;
    }
    
    public void addToCarrello(String username, String articolo, int quantita){
        List<Carrello> cart = getUserCarrello(username);
        boolean done = false;
        if(cart != null)
            for(int i = 0; i < cart.size() && !done; i++){
                Carrello c =cart.get(i);
                if(c.getArticolo().equals(articolo)){
                    done = true;
                    int q = c.getQuantita() + quantita;
                    carrelloFacade.queryPersonalizzata("UPDATE Carrello a SET a.quantita=" + q + " WHERE a.id=" + c.getId() + "").executeUpdate();
                }
            }
        if(!done){
            Carrello c = new Carrello();
            c.setArticolo(articolo);
            c.setQuantita(quantita);
            c.setUsername(username);
            carrelloFacade.create(c);
        }
        rimuoviDallaVendita(articolo, quantita);
    }
    
    public void rimuoviDallaVendita(String articolo, int quantita){
        Long id = Long.valueOf(articolo);
        Articolo a = articoloFacade.find(id);
        articoloFacade.queryPersonalizzata("UPDATE Articolo a SET a.quantita="+ (a.getQuantita() - quantita) + " WHERE a.id=" + id).executeUpdate();
    }
    
    public void mettiInVendita(String articolo, int quantita){
        Long id = Long.valueOf(articolo);
        Articolo a = articoloFacade.find(id);
        System.out.println(a.toString());
        articoloFacade.queryPersonalizzata("UPDATE Articolo a SET a.quantita="+ (a.getQuantita() + quantita) + " WHERE a.id=" + id).executeUpdate();
    }
    
    public void addToStorico(Carrello c, int quantita, String username){
        Storico s = new Storico();
        Date d = new Date();
        Articolo a = articoloFacade.find(Long.valueOf(c.getArticolo()));
        System.out.println(Long.valueOf(c.getArticolo()) + " " + Long.valueOf(c.getArticolo()).getClass());
        s.setArticolo(c.getArticolo());
        s.setDataAcquisto(d.toString());
        s.setPrezzoTot(a.getPrezzo_vendita()*quantita);
        s.setQuantita(quantita);
        s.setUsername(username);
        storicoFacade.create(s);
    }   
    
    
    public String getStatoPiste(){
        String piste = "";
        System.out.println("ricevo richiesta dal web service client --- PisteWebService");
        List<Pista> p = pistaFacade.queryPersonalizzata("SELECT p FROM Pista p").getResultList();
        for(int i = 0; i < p.size(); i++)
            piste += p.get(i).toString();
        return piste;
    }
}
